package negocio.cliente.negocio;

import gui.cliente.PopOutArquivo;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;
import javax.swing.JOptionPane;
import base.Util;
import base.transporte.SRPacket;
import base.transporte.SRSocket;

public class ReceptorArquivos implements Runnable {
	private Thread this_thread;
	private boolean listen;
	private SRSocket skt;

	public ReceptorArquivos(SRSocket skt) {
		this.skt = skt;

		listen = true;
	}

	public void start() {
		this_thread = new Thread(this);
		this_thread.start();
	}

	public void stop() {
		listen = false;
		this_thread.interrupt();
	}

	public void receberArquivo(StringTokenizer tokenizedLine) {
		String nomeArquivo = null;
		String tamanhoArquivo = null;

		try {
			nomeArquivo = tokenizedLine.nextToken();
			tamanhoArquivo = tokenizedLine.nextToken();

			long tam = Long.parseLong(tamanhoArquivo);
			String tamanho = Util.formatFilesize(tam);

			int op = JOptionPane.showConfirmDialog(null, "Deseja receber " + nomeArquivo + " (" + tamanho + ")", "Receber Arquivo", JOptionPane.YES_NO_OPTION);
			if (op == JOptionPane.YES_OPTION) {
				try {
					SRPacket pacote = new SRPacket((short) 1, ("ACEITAR").getBytes());
					System.out.println("Recebendo");
					skt.enviarPacote(pacote);
					long bytesAtual = 0;
					PopOutArquivo janelaArquivo = new PopOutArquivo();
					janelaArquivo.setAcao("Voce esta recebendo um arquivo: ");
					janelaArquivo.setBytesTotal(tamanho);
					janelaArquivo.setNomeArquivo(nomeArquivo);
					janelaArquivo.setBytesAtual(Util.formatFilesize(bytesAtual));
					janelaArquivo.setVisible(true);
					ByteArrayOutputStream buffer = new ByteArrayOutputStream(15000000);
					File f = new File("C:/temp/ArquivosRecebidos");
					try {
						if (f.mkdir())
							System.out.println("Directory Created");
						else
							System.out.println("Directory is not created");
					} catch (Exception e) {
						e.printStackTrace();
					}
					long time = System.currentTimeMillis();

					FileOutputStream fileOutStream = new FileOutputStream("C:/temp/ArquivosRecebidos/" + nomeArquivo);
					byte[] dado;
					do {
						dado = skt.receberPacote().getData();
						if (!(new String(dado)).equals("EOF")) {
							buffer.write(dado);
							if (buffer.size() > 10000000) {
								fileOutStream.write(buffer.toByteArray());
								buffer.reset();
							}
						} else {
							fileOutStream.write(buffer.toByteArray());
							buffer.reset();
						}
						bytesAtual += dado.length;
						if(System.currentTimeMillis() > time + 1000)
						{
							time = System.currentTimeMillis();
							janelaArquivo.setBytesAtual(Util.formatFilesize(bytesAtual));
							janelaArquivo.setVelocidadeTransferencia(skt.getVelDownloadFormatada());
							int progresso = (int)(((double)bytesAtual/tam) * 100);
							janelaArquivo.setProgresso(progresso);
							if(skt.getVelDownloadBytes() > 0)
								janelaArquivo.setTempoEstimado(((tam - bytesAtual) / skt.getVelDownloadBytes()) + "s");
						
						}
					} while (!(new String(dado)).equals("EOF"));
					fileOutStream.close();
					janelaArquivo.dispose();
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			} else {
				SRPacket pacote;
				try {
					pacote = new SRPacket((short) 1, ("RECUSAR").getBytes());
					skt.enviarPacote(pacote);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

		} catch (NoSuchElementException e) {
			try {
				skt.enviarPacote(new SRPacket(0, "COMANDO_MAL_FORMADO".getBytes()));
			} catch (Exception e1) {
				e.printStackTrace();
			}
			System.out.println("Comando mal formado.");
		}
		System.out.println("SAIU!!!");
	}

	@Override
	public void run() {
		while (listen) {

			SRPacket pkt = skt.receberPacote();
			String cmd = new String(pkt.getData());
			StringTokenizer tokenizedLine = new StringTokenizer(cmd);
			String comando = tokenizedLine.nextToken();
			// System.out.println(cmd);
			// System.out.println(cmd);
			if (pkt != null) {
				if (comando.equals("INICIO_TRANSFERENCIA")) {
					receberArquivo(tokenizedLine);
				}
			}
		}
	}
}
